package pe.edu.upc.karaoke.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

import pe.edu.upc.karaoke.excepcion.DAOExcepcion;
import pe.edu.upc.karaoke.modelo.Evento;
import pe.edu.upc.karaoke.modelo.Local;
import pe.edu.upc.karaoke.modelo.Sala;
import pe.edu.upc.karaoke.util.ConexionBD;


public class EventoDAO extends BaseDAO {
		
	public Evento obtener(int idEvento) throws DAOExcepcion {
		
		Evento evento = new Evento();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query =	"SELECT IDEVENTO, NOMBRE, FECHA, CAPACIDAD, DESCRIPCION FROM EVENTO " +
								"WHERE IDEVENTO=? " +
								"AND ELOG = 1";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idEvento);
				rs = stmt.executeQuery();
				
				if (rs.next()) {
					evento.setIdEvento(rs.getInt(1));
					evento.setNombre(rs.getString(2));
					evento.setFecha(rs.getDate(3));
					evento.setCapacidad(rs.getInt(4));
					evento.setDescripcion(rs.getString(5));
				}	
		} catch (SQLException e) {
				evento = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return evento;
	}

	
	public List<Evento> buscarPorNombre(String nombre) throws DAOExcepcion {
		
		List<Evento> lista = new ArrayList<Evento>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query =	"SELECT E.*, L.NOMBRE AS NO_LOCAL FROM EVENTO E, LOCAL L " +
								"WHERE E.NOMBRE LIKE ? " +
								"AND E.IDLOCAL = L.IDLOCAL " +
								"AND E.ELOG = 1";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, "%" + nombre + "%");
				rs = stmt.executeQuery();
				
				while (rs.next()) {

					Evento evento = new Evento();
					evento.setIdEvento(rs.getInt("IDEVENTO"));
					evento.setNombre(rs.getString("NOMBRE"));
					evento.setFecha(rs.getDate("FECHA"));
					evento.setCapacidad(rs.getInt("CAPACIDAD"));
					evento.setDescripcion(rs.getString("DESCRIPCION"));
					
					Local local = new Local();
					local.setIdlocal(rs.getInt("IDLOCAL"));
					local.setNombre(rs.getString("NO_LOCAL"));
					
					evento.setLocal(local);
					
					lista.add(evento);
				}
		} 
		catch (SQLException e) {
				lista = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} 
		finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return lista;
	}
	
	
	public Evento insertar(Evento evento) throws DAOExcepcion {
		
		java.util.Date d; //para trabajar con fecha y hora
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query =	"INSERT INTO EVENTO (NOMBRE, FECHA, CAPACIDAD, DESCRIPCION, ELOG, IDLOCAL) " +
								"VALUES (?,?,?,?,1,?)";
				
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, evento.getNombre());

				d = evento.getFecha();
				java.sql.Timestamp dt = new java.sql.Timestamp(d.getTime());
				
				stmt.setTimestamp(2, dt);
				stmt.setInt(3, evento.getCapacidad());
				stmt.setString(4, evento.getDescripcion());
				stmt.setInt(5, evento.getLocal().getIdlocal());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO INSERTAR");
				}
	
				int id = 0;
				query = "SELECT LAST_INSERT_ID()";
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				if (rs.next()) {
					id = rs.getInt(1);
				}
				evento.setIdEvento(id);

		} catch (SQLException e) {
				evento = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return evento;
	}

	public String eliminar(int idEvento) throws DAOExcepcion {
		
		Evento evento = new Evento();
		Connection con = null;
		PreparedStatement stmt = null;
		
		String vReturn = "NO_OK";
		try {
				String query = "UPDATE EVENTO SET ELOG = 0 WHERE IDEVENTO=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idEvento);
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO ELIMINAR");
				}else{
					vReturn = "OK";
				}
		} catch (SQLException e) {
				evento = null;	
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return vReturn;
	}

	
	public Evento actualizar(Evento evento) throws DAOExcepcion {
		
		java.util.Date d; //para trabajar con fecha y hora
		
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
				String query =	"UPDATE EVENTO SET NOMBRE=?, FECHA=?, CAPACIDAD=?, DESCRIPCION=?, IDLOCAL=? " +
								"WHERE IDEVENTO=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, evento.getNombre());
				
				d = evento.getFecha();
				java.sql.Timestamp dt = new java.sql.Timestamp(d.getTime());
				
				stmt.setTimestamp(2, dt);
				stmt.setInt(3, evento.getCapacidad());
				stmt.setString(4, evento.getDescripcion());
				stmt.setInt(5, evento.getLocal().getIdlocal());
				stmt.setInt(6, evento.getIdEvento());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO ACTUALIZAR");
				}
		} catch (SQLException e) {
				evento = null;	
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return evento;
	}
	
}
